Factor out a function
authorMatthias Clasen <mclasen@redhat.com>
Sat, 27 Sep 2014 03:28:55 +0000 (23:28 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 27 Sep 2014 03:30:29 +0000 (23:30 -0400)
Factor out the typename-to-get-type mangling as a separate
function, for easier testing.

Also fix some cases where it doesn't, currently, like
GString -> g_string_get_type and
GdkRGB -> gdk_rgb_get_type

gtk/gtkbuilder.c

index 7878a4360e49c60182a7530ea0eb507918759220..b07ee5eeabf23468f015516a0558eddc6438767c 100644 (file)
@@ -372,36 +372,43 @@ gtk_builder_get_property (GObject    *object,
  * GtkWindow -> gtk_window_get_type
  * GtkHBox -> gtk_hbox_get_type
  * GtkUIManager -> gtk_ui_manager_get_type
- *
+ * GdkRGB -> gdk_rgb_get_type
  */
-static GType
-_gtk_builder_resolve_type_lazily (const gchar *name)
+static gchar *
+type_name_mangle (const gchar *name)
 {
-  static GModule *module = NULL;
-  GTypeGetFunc func;
   GString *symbol_name = g_string_new ("");
-  char c, *symbol;
   int i;
-  GType gtype = G_TYPE_INVALID;
 
-  if (!module)
-    module = g_module_open (NULL, 0);
-  
   for (i = 0; name[i] != '\0'; i++)
     {
-      c = name[i];
       /* skip if uppercase, first or previous is uppercase */
-      if ((c == g_ascii_toupper (c) &&
-           i > 0 && name[i-1] != g_ascii_toupper (name[i-1])) ||
+      if ((i > 0 && name[i]  == g_ascii_toupper (name[i]) &&
+                   (name[i-1] != g_ascii_toupper (name[i-1]) || i == 1)) ||
           (i > 2 && name[i]   == g_ascii_toupper (name[i]) &&
-           name[i-1] == g_ascii_toupper (name[i-1]) &&
-           name[i-2] == g_ascii_toupper (name[i-2])))
+                    name[i-1] == g_ascii_toupper (name[i-1]) &&
+                    name[i-2] == g_ascii_toupper (name[i-2]) &&
+                    name[i+1] != 0 && name[i+1] != g_ascii_toupper (name[i+1])))
         g_string_append_c (symbol_name, '_');
-      g_string_append_c (symbol_name, g_ascii_tolower (c));
+      g_string_append_c (symbol_name, g_ascii_tolower (name[i]));
     }
   g_string_append (symbol_name, "_get_type");
+
+  return g_string_free (symbol_name, FALSE);
+}
+
+static GType
+_gtk_builder_resolve_type_lazily (const gchar *name)
+{
+  static GModule *module = NULL;
+  GTypeGetFunc func;
+  gchar *symbol;
+  GType gtype = G_TYPE_INVALID;
+
+  if (!module)
+    module = g_module_open (NULL, 0);
   
-  symbol = g_string_free (symbol_name, FALSE);
+  symbol = type_name_mangle (name);
 
   if (g_module_symbol (module, symbol, (gpointer)&func))
     gtype = func ();